package h0712;

import java.util.*;

/**
  * @description  勾股数元组
  * @author 不知名帅哥
  * @date 2024/7/12 22:54
  * @version 1.0
*/
public class PythagoreanNumber {
    public static void main(String[] args) {
        Scanner sc=new Scanner(System.in);
        //范围
        int n = sc.nextInt();
        int m=sc.nextInt();
        //输出描述
        //1. a,b,c请保证a < b < c,输出格式：a b c；
        //
        //2. 多组勾股数元组请按照a升序，b升序，最后c升序的方式排序输出；
        //
        //3. 给定范围中如果找不到勾股数元组时，输出”NA“。
        getResult(n,m);
    }

    private static void getResult(int n, int m) {
        //找出范围内所有的质数。
        List<int[]> list=new ArrayList<>();
        Set<Integer> set = new HashSet<>();
        for (int i = n; i <= m; i++) {
            set.add(i*i);
        }
        for (int i = n; i <= m; i++) {
            for (int j = i+1; j <= m; j++) {
                int h = i * i + j * j;
                double sqrt = Math.sqrt(h);
                if (set.contains(h)&&isPrime(i,j,(int) sqrt)){
                    list.add(new int[]{i,j,(int) sqrt});
                }
                //第二种方法：int sqrt=(int)Math.sqrt(h);
                //if(h==sqrt*sqrt)。判断是否是整数，小数取整的话肯定不相等。
            }
        }

        Collections.sort(list, (o1, o2) -> {
            if (o1[0]!=o2[0]){
                return o1[0]-o2[0];
            }
            if (o1[1]!=o2[1]){
                return o1[1]-o2[1];
            }
            return o1[2]-o2[2];
        });
        
        if (list.isEmpty()){
            System.out.println("NA");
        }else {
            for (int[] l : list) {
                System.out.println(l[0]+" "+l[1]+" "+l[2]);
            }
            System.out.println();
        }
    }

    //判断是否互质
    private static boolean isPrime(int a,int b,int c) {
        int temp = gcd(a, b);
        return gcd(temp,c)==1;
    }
    private static int gcd(int x, int y) {
        while (y != 0) {
            int temp = y;
            y = x % y;
            x = temp;
        }
        return x;
    }
}
